package com.kfm.storage.watcher;

/**
 * @author Aurora雪
 */

import java.io.IOException;
import java.nio.file.*;
import java.nio.file.WatchEvent.Kind;

/**
 * FolderWatcher用来创建一个文件夹监视器，监视文件夹中的文件变化
 */
public class FolderWatcher {
    public static void FolderWatcher(String localFolderPath, String remoteIpAddress, int remotePort) {
        //创建watchService对象并注册要监听的事件类型
        try (WatchService watchService = FileSystems.getDefault().newWatchService()) {
            //要监听的本地文件夹路径
            Path filePath = Paths.get(localFolderPath);
            //监听本地文件夹的创建、修改、删除事件
            filePath.register(watchService, StandardWatchEventKinds.ENTRY_CREATE,
                    StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_DELETE);

            System.out.println("开始监听文件夹：" + localFolderPath);

            //创建一个线程用来监听文件夹的变化
            while (true){
                //获取下一个文件变化的事件
                WatchKey key = watchService.take();

                // 处理文件变化事件
                for (WatchEvent<?> event : key.pollEvents()) {
                    //获取文件变化事件的类型
                    Kind<?> kind = event.kind();

                    //suppressWarnings用来抑制编译器警告
                    //获取文件变化事件
                    WatchEvent<Path> watchEvent = (WatchEvent<Path>) event;
                    //获取文件变化事件的文件名
                    Path fileName = watchEvent.context();

                    //根据文件变化事件的类型进行相应的处理
                    if (kind == StandardWatchEventKinds.ENTRY_CREATE || kind == StandardWatchEventKinds.ENTRY_MODIFY) {
                        //文件创建事件
                        System.out.println("创建或修改文件：" + fileName);
                        //同步文件到远程服务器
                        SyncFile.syncFile(localFolderPath + "\\" + fileName, remoteIpAddress, remotePort);
                    }else {
                        //文件删除事件
                        System.out.println("删除文件：" + fileName);
                        //删除远程服务器上的文件
                        DeleteFile.deleteFileFromRemoteServer(String.valueOf(fileName), remoteIpAddress, remotePort, "delete");
                    }
                }
                // 重置WatchKey对象，以便可以继续接收事件
                boolean valid = key.reset();

                // 如果WatchKey无效，则退出循环
                if (!valid) {
                    break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}
